#!/usr/bin/python3
# -*- coding: utf-8 -*-

from flask import request
from ..services.user_service import UserService
from ..services.auth_service import AuthService
from ..utils.api_response import ApiResponse
from ..utils.auth_utils import get_token_from_request

class UserController:
    """用户控制器"""
    
    @staticmethod
    def update_user(user_id):
        """更新用户信息
        
        Args:
            user_id: 路径中的用户ID
        """
        data = request.get_json()
        
        # 验证必要字段
        if not data:
            return ApiResponse.error("请提供更新信息", 400)
        
        # 使用工具函数获取token
        token = get_token_from_request()
        
        if not token:
            return ApiResponse.error("缺少token，请在请求头或请求体中提供", 401)
        
        # 验证token
        is_valid, user_info, message = AuthService.validate_user_token(token)
        if not is_valid:
            return ApiResponse.error(message, 401)
        
        # 用户只能更新自己的信息，或者管理员可以更新任何人
        token_user_id = user_info.get('user_id')
        roles = user_info.get('roles', [])
        
        if token_user_id != user_id and 'admin' not in roles:
            return ApiResponse.error("您没有权限更新其他用户的信息", 403)
        
        # 更新数据
        update_data = {k: v for k, v in data.items() if k != 'token'}
        update_data['user_id'] = user_id
        
        try:
            updated_user = UserService.update_user(update_data)
            # 直接返回更新后的用户数据，不再包装
            return ApiResponse.success(updated_user)
        except ValueError as e:
            return ApiResponse.error(str(e), 400)
        except Exception as e:
            return ApiResponse.error(f"更新失败: {str(e)}", 500)
    
    @staticmethod
    def legacy_update_user():
        """处理旧版更新用户接口
        
        使用token从请求中获取用户ID，然后更新该用户的信息
        保持与原始/update-user端点的兼容性
        """
        data = request.get_json()
        
        # 验证必要字段
        if not data:
            return ApiResponse.error("请提供更新信息", 400)
        
        # 使用工具函数获取token
        token = get_token_from_request()
        
        if not token:
            return ApiResponse.error("缺少token，请在请求头或请求体中提供", 401)
        
        # 验证token
        is_valid, user_info, message = AuthService.validate_user_token(token)
        if not is_valid:
            return ApiResponse.error(message, 401)
        
        # 获取用户ID
        user_id = user_info.get('user_id')
        if not user_id:
            return ApiResponse.error("无法识别用户", 401)
        
        # 更新数据
        update_data = {k: v for k, v in data.items() if k != 'token'}
        update_data['user_id'] = user_id
        
        try:
            updated_user = UserService.update_user(update_data)
            
            # 只返回基本字段，不包括扩展字段
            if isinstance(updated_user, dict):
                # 移除扩展字段
                basic_fields = ['id', 'user_id', 'username', 'email', 'name', 
                               'token', 'created_time', 'updated_time', 'gender', 
                               'address', 'phone', 'birthday', 'company', 'job', 'website', 'age']
                updated_user = {k: v for k, v in updated_user.items() if k in basic_fields}
            
            # 直接返回更新后的用户数据
            return ApiResponse.success(updated_user)
        except ValueError as e:
            return ApiResponse.error(str(e), 400)
        except Exception as e:
            return ApiResponse.error(f"更新失败: {str(e)}", 500)
    
    @staticmethod
    def get_user(user_id):
        """获取单个用户信息
        
        Args:
            user_id: 路径中的用户ID
        """
        # 使用工具函数获取token（用于权限验证）
        token = get_token_from_request()
        
        if not token:
            return ApiResponse.error("缺少认证信息", 401)
        
        # 验证token
        is_valid, user_info, message = AuthService.validate_user_token(token)
        if not is_valid:
            return ApiResponse.error(message, 401)
        
        # 用户只能查看自己的信息，或者管理员可以查看任何人
        token_user_id = user_info.get('user_id')
        roles = user_info.get('roles', [])
        
        if token_user_id != user_id and 'admin' not in roles:
            return ApiResponse.error("您没有权限查看其他用户的信息", 403)
        
        try:
            # 获取详细程度参数
            detail_level = request.args.get('detail', 'full')
            include_extended = detail_level == 'full'
            
            user = UserService.get_user_by_id(user_id, include_extended_info=include_extended)
            if not user:
                return ApiResponse.error("用户不存在", 404)
                
            return ApiResponse.success(user)
        except Exception as e:
            return ApiResponse.error(f"获取用户信息失败: {str(e)}", 500)
    
    @staticmethod
    def delete_user(user_id):
        """删除用户
        
        Args:
            user_id: 路径中的用户ID
        """
        # 使用工具函数获取token（用于权限验证）
        token = get_token_from_request()
        
        if not token:
            return ApiResponse.error("缺少认证信息", 401)
        
        # 验证token
        is_valid, user_info, message = AuthService.validate_user_token(token)
        if not is_valid:
            return ApiResponse.error(message, 401)
        
        # 只有管理员可以删除用户
        roles = user_info.get('roles', [])
        
        if 'admin' not in roles:
            return ApiResponse.error("您没有权限删除用户", 403)
        
        try:
            success = UserService.delete_user(user_id)
            if not success:
                return ApiResponse.error("用户不存在或删除失败", 404)
                
            return ApiResponse.success({"message": "用户已成功删除"})
        except Exception as e:
            return ApiResponse.error(f"删除用户失败: {str(e)}", 500)
    
    @staticmethod
    def list_users():
        """获取用户列表（管理员接口）"""
        # 获取分页参数
        page = request.args.get('page', 1, type=int)
        limit = request.args.get('limit', 100, type=int)
        
        # 限制最大返回数量
        if limit > 500:
            limit = 500
        
        offset = (page - 1) * limit
        
        # 使用工具函数获取token（用于权限验证）
        token = get_token_from_request()
        
        if not token:
            return ApiResponse.error("缺少认证信息", 401)
        
        # 验证token
        is_valid, user_info, message = AuthService.validate_user_token(token)
        if not is_valid:
            return ApiResponse.error(message, 401)
        
        # 只有管理员可以查看用户列表
        roles = user_info.get('roles', [])
        
        if 'admin' not in roles:
            return ApiResponse.error("您没有权限查看用户列表", 403)
        
        try:
            users = UserService.get_all_users(limit, offset)
            return ApiResponse.success({
                "count": len(users),
                "page": page,
                "limit": limit,
                "users": users
            })
        except Exception as e:
            return ApiResponse.error(f"获取用户列表失败: {str(e)}", 500)
    
    @staticmethod
    def mock_userinfo():
        """生成模拟用户信息"""
        try:
            # 获取字段选择参数
            fields_option = request.args.get('fields', 'full')
            include_fields = request.args.get('include', '')
            
            # 生成模拟用户数据
            user = UserService.generate_mock_user(detail_level=fields_option)
            
            # 如果是自定义字段，过滤结果
            if fields_option == 'custom' and include_fields:
                requested_fields = [field.strip() for field in include_fields.split(',')]
                user = {k: v for k, v in user.items() if k in requested_fields}
                
            return ApiResponse.success(user)
        except Exception as e:
            return ApiResponse.error(f"生成模拟用户信息失败: {str(e)}", 500) 